function ajax({ type = "get", data = {}, success, error, timeout = 10000, url } = {}) {
    let str = "";
    for (let i in data) {
        str += `${i}=${data[i]}&`;
    }
    if (type === "get") {
        url += "?" + str + "_qft_=" + Date.now();
    }
    const xhr = new XMLHttpRequest();
    /*  
    open方法用于创建HTTP请求，但是请求并未发送，其定义如下：
    
    参数method定义请求的类型，如GET、POST方法等等，大小写不敏感
    参数url定义请求的URL地址
    参数async定义是否异步处理请求，true(异步)或者false(同步)，默认为true
    参数username定义用户名，不常用，默认为null
    参数password定义密码，不常用，默认为null 
    */
    xhr.open(type, url, true);
    xhr.onload = function () {
        if (xhr.status === 200) {
            success && success(xhr.responseText);
            success = null;
            error = null;
        } else {
            error && error(xhr.status);
            success = null;
            error = null;
        }
    }
    if (type === "post") {
        /*
        setRequestHeader方法用于向请求添加HTTP头，其定义如下:

        参数name定义HTTP请求头部的名称
        参数value定义HTTP请求头部的值
        */
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        /*
        send方法用于发送open方法创建的HTTP请求，其定义如下：

        参数body定义HTTP请求的数据，当HTTP请求的方法为GET、HEAD时，该参数被忽略。body的类型可以为ArrayBuffer(二进制缓冲数组)、Blob(二进制大对象)、Document(类似XML格式的数据)、DOMString（字符串）、FormData(表单)。
        */ 
        xhr.send(str.slice(0, str.length - 1));
    } else {
        xhr.send();
    }
    setTimeout(() => {
        error && error("timeout");
        success = null;
        error = null;
    }, timeout);
}